/**
 *
 * @author Oscar
 * Clase que realiza las operaciones en la Base de Datos para el modulo de autenticacion
 */

package capadatos;

import sistemaamd.ServiceResult;
import sistemaamd.ConstantesSP;
import sistemaamd.Proyecto;

import java.util.ArrayList;
import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ModuloProyectosCapaDatos {

    //instancia del manejador
    private ManejadorBaseDatos manejadorBaseDatos;

    public ModuloProyectosCapaDatos() {
        //se inicializa la instancia del manejador
        this.manejadorBaseDatos = new ManejadorBaseDatos();
    }

    /**
     * obtiene el estado de error del manejador
     * @return
     */
    public Boolean getExisteError() {
        return this.manejadorBaseDatos.getExisteError();
    }

    /**
     * obtiene el mensaje de error del manejador
     * @return
     */
    public String getMensajeError() {
        return this.manejadorBaseDatos.getDescripcionError();
    }

    //Consulta para obtener un proyecto en particular
    public ServiceResult cargarProyecto(int idProyecto)
    {
        ServiceResult resultado;

        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_OBTENER_PROYECTO);
            calls.setInt(ConstantesSP.PARAM_OBTENER_PROYECTO_ID, idProyecto);
            boolean esResultSet=calls.execute();

            ArrayList<Proyecto> listaProyectos = new ArrayList<Proyecto>();
            if (esResultSet){
                rs=calls.getResultSet();
                if (!rs.wasNull()){
                    while(rs.next()){
                        int id=rs.getInt(ConstantesSP.RETURN_OBTENER_PROYECTO_ID);
                        String nombre = rs.getString(ConstantesSP.RETURN_OBTENER_PROYECTO_NOMBRE);

                        Proyecto proy=new Proyecto(id,nombre);
                        listaProyectos.add(proy);
                    }
                    resultado.setValorResultado(listaProyectos);
                    rs.close();
                }
                else {
                    resultado = new ServiceResult("ERROR: Resultset es null");
                }
            }
            else {
                resultado = new ServiceResult("ERROR: No hay Resultset");
            }
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    //Consulta para cargar proyectos
    public ServiceResult cargarProyectos()
    {
        ServiceResult resultado;

        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_OBTENER_PROYECTOS);
            boolean esResultSet=calls.execute();

            ArrayList<Proyecto> listaProyectos = new ArrayList<Proyecto>();
            if (esResultSet){
                rs=calls.getResultSet();
                if (!rs.wasNull()){
                    while(rs.next()){
                        int id=rs.getInt(ConstantesSP.RETURN_OBTENER_PROYECTOS_ID);
                        String nombre = rs.getString(ConstantesSP.RETURN_OBTENER_PROYECTOS_NOMBRE);

                        Proyecto proy=new Proyecto(id,nombre);
                        listaProyectos.add(proy);
                    }
                    resultado.setValorResultado(listaProyectos);
                    rs.close();
                }
                else {
                    resultado = new ServiceResult("ERROR: Resultset es null");
                }
            }
            else {
                resultado = new ServiceResult("ERROR: No hay Resultset");
            }
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    //Consulta para cargar proyectos de RProy
    public ServiceResult obtenerProyectosRProy(int idUsuario)
    {
        ServiceResult resultado;

        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_OBTENER_PROYECTOS_RPROY);
            calls.setInt(ConstantesSP.PARAM_OBTENER_PROYECTOS_RPROY_IDUSUARIO, idUsuario);
            boolean esResultSet=calls.execute();

            ArrayList<Proyecto> listaProyectos = new ArrayList<Proyecto>();
            if (esResultSet){
                rs=calls.getResultSet();
                if (!rs.wasNull()){
                    while(rs.next()){
                        int id=rs.getInt(ConstantesSP.RETURN_OBTENER_PROYECTOS_RPROY_ID);
                        String nombre = rs.getString(ConstantesSP.RETURN_OBTENER_PROYECTOS_RPROY_NOMBRE);

                        Proyecto proy=new Proyecto(id,nombre);
                        listaProyectos.add(proy);
                    }
                    resultado.setValorResultado(listaProyectos);
                    rs.close();
                }
                else {
                    resultado = new ServiceResult("ERROR: Resultset es null");
                }
            }
            else {
                resultado = new ServiceResult("ERROR: No hay Resultset");
            }
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    //Consulta para cargar oficiales de proyecto
    public ServiceResult cargarOficialesDeProyecto(String idUsuario)
    {
        String nombre="";
        ServiceResult resultado;

        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_OBTENER_OFICIALES_DE_PROYECTO);
            calls.registerOutParameter(ConstantesSP.PARAM_OBTENER_OFICIALES_DE_PROYECTO_TIPO, Types.VARCHAR);
            calls.execute();

            /*rs=calls.executeQuery();
            if (rs.next()){
                nombre = rs.getString(3);
                ArrayList valorResultado = new ArrayList();
                valorResultado.add(nombre);
                resultado.setValorResultado(valorResultado);
            }
            else //(nombre==null)
                resultado = new ServiceResult("ERROR: No existe ese usuario con esa contraseña. " + this.manejadorBaseDatos.getDescripcionError());
            rs.close();*/

            ArrayList valorResultado = new ArrayList();
            valorResultado.add(nombre);
            resultado.setValorResultado(valorResultado);
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    //Consulta para cargar asignar un oficial a un proyecto
    public ServiceResult asignarOficialesDeProyecto(String proyecto, String oficial)
    {
        String nombre="";
        ServiceResult resultado;

        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_ASIGNAR_OFICIAL_DE_PROYECTO);
            calls.registerOutParameter(ConstantesSP.PARAM_ASIGNAR_OFICIAL_DE_PROYECTO_NOMBRE, Types.VARCHAR);
            calls.registerOutParameter(ConstantesSP.PARAM_ASIGNAR_OFICIAL_DE_PROYECTO_OFICIAL, Types.VARCHAR);
            
            calls.execute();

            /*rs=calls.executeQuery();
            if (rs.next()){
                nombre = rs.getString(3);
                ArrayList valorResultado = new ArrayList();
                valorResultado.add(nombre);
                resultado.setValorResultado(valorResultado);
            }
            else //(nombre==null)
                resultado = new ServiceResult("ERROR: No existe ese usuario con esa contraseña. " + this.manejadorBaseDatos.getDescripcionError());
            rs.close();*/

            ArrayList valorResultado = new ArrayList();
            valorResultado.add(nombre);
            resultado.setValorResultado(valorResultado);
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    //Consulta para cargar evaluar un proyecto
    public ServiceResult evaluarProyecto(String proyecto)
    {
        String nombre="";
        ServiceResult resultado;

        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_EVALUAR_PROYECTO);
            calls.registerOutParameter(ConstantesSP.PARAM_EVALUAR_PROYECTO_NOMBRE, Types.VARCHAR);

            calls.execute();

            /*rs=calls.executeQuery();
            if (rs.next()){
                nombre = rs.getString(3);
                ArrayList valorResultado = new ArrayList();
                valorResultado.add(nombre);
                resultado.setValorResultado(valorResultado);
            }
            else //(nombre==null)
                resultado = new ServiceResult("ERROR: No existe ese usuario con esa contraseña. " + this.manejadorBaseDatos.getDescripcionError());
            rs.close();*/

            ArrayList valorResultado = new ArrayList();
            valorResultado.add(nombre);
            resultado.setValorResultado(valorResultado);
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }
}
